/**
 * 泛型对象类型
 * */

// interface Box {
//   contents: any
// }

// interface Box {
//   contents: unknown
// }

// let x_box: Box = {
//   contents: 'hello world'
// }
// // 方法一 判断去缩小范围
// if (typeof x_box.contents === 'string') {
//   console.log(x_box.contents.toLowerCase())
// }
// // 类型断言确定类型
// console.log((x_box.contents as string).toLowerCase())

// interface NumberBox {
//   contents: number
// }

// interface StringBox {
//   contents: string
// }

// interface BooleanBox {
//   contents: boolean
// }
// // 写起来不优雅，非常的麻烦
// function setContents(box: StringBox, newContents: string): void
// function setContents(box: NumberBox, newContents: number): void
// function setContents(box: BooleanBox, newContents: boolean): void
// function setContents(box: { contents: any }, newContents: any) {
//   box.contents = newContents
// }

// 泛型对象的方法
// interface Box<T> {
//   contents: T
// }

// let box: Box<string> = {
//   contents: 'hello'
// }

// interface Box<Type> {
//   contents: Type
// }

// interface Apple {
//   // ...
// }

// let a_apple: Apple = {}

// type AppleBox = Box<Apple>
// let ab: AppleBox = {
//   contents: a_apple
// }

type Box<Type> = {
  contents: Type
}

type OrNull<Type> = Type | null

type oneOrMany<Type> = Type | Type[]

type oneOrManyOrNull<Type> = OrNull<oneOrMany<Type>>

type oneOrManyOrNullString = oneOrManyOrNull<string>